home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 25 / CU Amiga Magazine's Super CD-ROM 25 (1998)(EMAP Images)(GB)(Track 1 of 2)[!][issue 1998-08].iso / CUCD / Programming / QuakeTools / src / libqdisplay / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-06-12  |  10.2 KB  |  336 lines

  1. #define    LIBQTOOLS_CORE
  2. #define    LIBQDISPLAY_CORE
  3. #include "../include/libqdisplay.h"
  4. #include "../include/libqsys.h"
  5.  
  6. struct memory bspStatic;
  7. struct memory *bspMem = &bspStatic;
  8.  
  9. int frameCounter;
  10.  
  11. #ifdef CALCULATE_PIXELDRAW
  12. int pixelDraw;
  13. int pixelOverdraw;
  14. #endif
  15.  
  16. void run_demo(__memBase)
  17. {
  18.   angvec lastCamera = {0, 0, 0};
  19.  
  20. #ifdef PROFILE
  21.   for (frameCounter = 0; frameCounter < 10; frameCounter++) {
  22. #else
  23.   int updownHeight, leftrightWidth;
  24.   float updownAngles, leftrightAngles;
  25.   int flyMode = FALSE;
  26.   struct keyEvent inPut;
  27.   
  28.   for (frameCounter = 0;; frameCounter++) {
  29. #endif
  30.    /*
  31.     * first verify the validity of the display and the renderers informations
  32.     */
  33.     if(localDim.changedBuffer) {                            // changedSize need not implicate changeBuffer
  34.       InitMultTables(localDim.Width, localDim.Height);
  35.       set_clip_values(localDim.Width, localDim.Height);
  36.       localDim.changedBuffer = FALSE;
  37.       changedAngles = TRUE;
  38.     }
  39.     if(localDim.changedOffset || localDim.changedSize) {
  40.       if(flyMode) {
  41.         cameraAngles.tx = (int)((localDim.X - updownHeight) * updownAngles);
  42.         cameraAngles.tz = (int)((localDim.Y - leftrightWidth) * leftrightAngles);
  43.         changedAngles = TRUE;
  44.       }
  45.       if(localDim.changedSize) {
  46.         updownHeight = (localDim.dtHeight - localDim.Height) / 2;
  47.         leftrightWidth = (localDim.dtWidth - localDim.Width) / 2;
  48.         updownAngles = 90.0 / updownHeight;
  49.         leftrightAngles = 180.0 / leftrightWidth;
  50.       }
  51.       localDim.changedOffset = FALSE;
  52.       localDim.changedSize = FALSE;
  53.     }
  54.     if(localDim.changedDesktopOffset) {
  55.       localDim.changedDesktopOffset = FALSE;
  56.     }
  57.     if(localDim.changedDesktopSize) {
  58.       updownHeight = (localDim.dtHeight - localDim.Height) / 2;
  59.       leftrightWidth = (localDim.dtWidth - localDim.Width) / 2;
  60.       updownAngles = 90.0 / updownHeight;
  61.       leftrightAngles = 180.0 / leftrightWidth;
  62.       localDim.changedDesktopSize = FALSE;
  63.     }
  64.  
  65.    /*
  66.     * recalc renderer if nessecary and render and display
  67.     */
  68.     set_view_info();
  69.     memset(localDim.frameBuffer, 0, localDim.frameSize);
  70.     render_world(bspMem);
  71.     localDim.frameBuffer = SwapDisplay(localDim.frameBuffer);
  72.  
  73. #ifdef CALCULATE_PIXELDRAW
  74.     memset(localDim.frameBuffer, 0, localDim.frameSize);
  75.     mprintf("draw pixel: %d, overdrawn pixel: %d\n", pixelDraw, pixelOverdraw);
  76.     pixelDraw = pixelOverdraw = 0;
  77. #endif
  78. #ifndef PROFILE
  79.    /*
  80.     * parse inputevents, this is also the only way to communicate 
  81.     * with the user-interface, if the display changes, verify it in
  82.     * that routine
  83.     */
  84.     while(GetKeys(&inPut)) {
  85.       if(inPut.pressed == RAWKEY_NOTHING)
  86.         break;
  87.  
  88.       switch(inPut.pressed) {
  89.         case RAWKEY_ESCAPE:
  90.         case RAWKEY_q:
  91.           return;
  92.           break;
  93.  
  94.         case RAWKEY_NUMPAD_PGDN:
  95.           cameraAngles.tx += (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  96.           changedAngles = TRUE;
  97.           break;
  98.         case RAWKEY_NUMPAD_PGUP:
  99.           cameraAngles.tx -= (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  100.           changedAngles = TRUE;
  101.           break;
  102.         case RAWKEY_NUMPAD_HOME:
  103.           currentSpeed[2] += (inPut.qualifier == RAWQUAL_RSHIFT ? 2 * incSpeed : incSpeed);
  104.           changedLocation = TRUE;
  105.           break;
  106.         case RAWKEY_NUMPAD_END:
  107.           currentSpeed[2] -= (inPut.qualifier == RAWQUAL_RSHIFT ? 2 * incSpeed : incSpeed);
  108.           changedLocation = TRUE;
  109.           break;
  110.         case RAWKEY_NUMPAD_AWUP:
  111.           currentSpeed[0] += (inPut.qualifier == RAWQUAL_RSHIFT ? 2 * incSpeed : incSpeed);
  112.           changedLocation = TRUE;
  113.           break;
  114.         case RAWKEY_NUMPAD_AWDN:
  115.           currentSpeed[0] -= (inPut.qualifier == RAWQUAL_RSHIFT ? 2 * incSpeed : incSpeed);
  116.           changedLocation = TRUE;
  117.           break;
  118.         case RAWKEY_NUMPAD_AWRIGHT:
  119.           cameraAngles.tz += (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  120.           changedAngles = TRUE;
  121.           break;
  122.         case RAWKEY_NUMPAD_AWLEFT:
  123.           cameraAngles.tz -= (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  124.           changedAngles = TRUE;
  125.           break;
  126.         case RAWKEY_NUMPAD_PLUS:
  127.           cameraAngles.ty += (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  128.           changedAngles = TRUE;
  129.           break;
  130.         case RAWKEY_NUMPAD_MINUS:
  131.           cameraAngles.ty -= (inPut.qualifier == RAWQUAL_RSHIFT ? 20 : 10);
  132.           changedAngles = TRUE;
  133.           break;
  134.         case RAWKEY_f:
  135.           if((flyMode ^= TRUE) == TRUE)
  136.             currentSpeed[0] = currentSpeed[2] = (maxSpeed / 3);
  137.           else
  138.             currentSpeed[2] = -(maxSpeed / 3);
  139.           changedLocation = TRUE;
  140.           break;
  141.       }
  142.     }
  143.  
  144.     /*
  145.      * validate input events
  146.      */
  147.     if(flyMode) {
  148.       if(cameraAngles.tz - lastCamera.tz) {
  149.         cameraAngles.ty -= (cameraAngles.tz - lastCamera.tz) / 4;
  150.         changedAngles = TRUE;
  151.       }
  152.       currentSpeed[0] += decSpeed;
  153.       changedLocation = TRUE;
  154.     }
  155.     
  156.     if(changedAngles) {
  157.       if (cameraAngles.tx > 360)
  158.         cameraAngles.tx -= 360;
  159.       else if (cameraAngles.tx < 0)
  160.         cameraAngles.tx += 360;
  161.  
  162.       if (cameraAngles.ty > 360)
  163.         cameraAngles.ty -= 360;
  164.       else if (cameraAngles.ty < 0)
  165.         cameraAngles.ty += 360;
  166.       if ((cameraAngles.ty > 45) && (cameraAngles.ty < 180))
  167.         cameraAngles.ty = 45;
  168.       else if ((cameraAngles.ty < 315) && (cameraAngles.ty > 180))
  169.         cameraAngles.ty = 315;
  170.       
  171.       if (cameraAngles.tz > 360)
  172.         cameraAngles.tz -= 360;
  173.       else if (cameraAngles.tz < 0)
  174.         cameraAngles.tz += 360;
  175.  
  176.       lastCamera.tz = cameraAngles.tz;
  177.     }
  178.  
  179.     if(changedLocation) {        
  180.       if (currentSpeed[0] >= maxSpeed)
  181.         currentSpeed[0] = maxSpeed;
  182.       else if (currentSpeed[0] <= -maxSpeed)
  183.         currentSpeed[0] = -maxSpeed;
  184.  
  185.       if (currentSpeed[2] >= maxSpeed)
  186.         currentSpeed[2] = maxSpeed;
  187.       else if (currentSpeed[2] <= -maxSpeed)
  188.         currentSpeed[2] = -maxSpeed;
  189.     }
  190. #else
  191.     switch(frameCounter) {
  192.       case 0:
  193.           if ((cameraAngles.tx += 25) > 360)
  194.         cameraAngles.tx -= 360;
  195.           changedAngles = TRUE;
  196.         break;
  197.       case 1:
  198.           if ((cameraAngles.tx += 25) > 360)
  199.         cameraAngles.tx -= 360;
  200.           changedAngles = TRUE;
  201.         break;
  202.       case 2:
  203.           if ((cameraAngles.tx -= 75) < 0)
  204.         cameraAngles.tx += 360;
  205.           changedAngles = TRUE;
  206.         break;
  207.       case 3:
  208.           if ((cameraAngles.tx -= 25) < 0)
  209.         cameraAngles.tx += 360;
  210.           changedAngles = TRUE;
  211.         break;
  212.       case 4:
  213.           if ((cameraAngles.tx += 50) > 360)
  214.         cameraAngles.tx -= 360;
  215.           changedAngles = TRUE;
  216.         break;
  217.       case 5:
  218.           if ((cameraAngles.tz += 25) > 360)
  219.         cameraAngles.tz -= 360;
  220.           changedAngles = TRUE;
  221.         break;
  222.       case 6:
  223.           if ((cameraAngles.tz += 25) > 360)
  224.         cameraAngles.tz -= 360;
  225.           changedAngles = TRUE;
  226.         break;
  227.       case 7:
  228.           if ((cameraAngles.tz += 25) > 360)
  229.         cameraAngles.tz -= 360;
  230.           changedAngles = TRUE;
  231.         break;
  232.       case 8:
  233.           if ((cameraAngles.tz += 25) > 360)
  234.         cameraAngles.tz -= 360;
  235.           changedAngles = TRUE;
  236.         break;
  237.       case 9:
  238.           if ((cameraAngles.tz += 25) > 360)
  239.         cameraAngles.tz -= 360;
  240.           changedAngles = TRUE;
  241.         break;
  242.     }
  243. #endif
  244.   }
  245. }
  246.  
  247. int main(int argc, char **argv)
  248. {
  249.   FILE *bspFile;
  250.  
  251.   if (!setjmp(eabort)) {
  252.     if((bspFile = fopen(argv[1], READWRITE_BINARY_OLD))) {
  253.       if((bspMem = LoadBSP(bspFile, ALL_LUMPS | ALL_MAPS))) {
  254.         struct entity *plEnt;
  255.       
  256.         bspMem->mapOptions |= MAP_LOADLIGHTS;
  257.         LoadMapFile(bspMem, bspMem->dentdata);
  258.         if(!(visibleFaces = (unsigned char *)kmalloc((bspMem->numfaces + 32) * sizeof(unsigned char))))
  259.           Error("failed to allocate visible faces\n");
  260.         if(!(visibleLeafs = (unsigned char *)kmalloc(((bspMem->numleafs >> 3) + 32) * sizeof(unsigned char))))
  261.           Error("failed to allocate visible leafs\n");
  262.         memset(visibleLeafs, 0xFF, ((bspMem->numleafs >> 3) + 1) * sizeof(unsigned char));
  263.         if(!(visibleNodes = (unsigned char *)kmalloc(((bspMem->numnodes >> 3) + 32) * sizeof(unsigned char))))
  264.           Error("failed to allocate visible nodes\n");
  265.         memset(visibleNodes, 0xFF, ((bspMem->numnodes >> 3) + 1) * sizeof(unsigned char));
  266.         
  267.         /*
  268.          * find players start-point
  269.          */
  270.         if((plEnt = FindEntityWithKeyPair(bspMem, "classname", "info_player_start"))) {
  271.           VectorCopy(plEnt->origin, cameraLocation);
  272.       cameraAngles.tx = 0;
  273.       cameraAngles.ty = 0;
  274.           cameraAngles.tz = plEnt->angle;
  275.           printf("Current Pos - [%f] [%f] [%f]\nAngle [%d]\n", cameraLocation[0], cameraLocation[1], cameraLocation[2], cameraAngles.tz);
  276.           changedAngles = TRUE;
  277.           changedLocation = TRUE;
  278.         }
  279.         
  280.         /*
  281.          * force load of palette and colormap
  282.          */
  283.         darkness = 63;
  284.         tfree(GetPalette());
  285.         
  286.         if(cachedColormap && cachedPalette) {
  287. //mprintf("set display\n");
  288.           SetDisplay(OpenDisplay(atoi(argv[2]), atoi(argv[3]), 8, cachedPalette));
  289.           OpenKeys();
  290.           
  291. //mprintf("set water\n");
  292.           // setup water
  293.           waterTransparency = GetTransparency(DENSITY_WATER);
  294. //mprintf("set slime\n");
  295.           // setup slime
  296.           slimeTransparency = GetTransparency(DENSITY_SLIME);
  297. //mprintf("set lava\n");
  298.           // setup lava
  299.           lavaTransparency = GetTransparency(DENSITY_LAVA);
  300.         
  301. //mprintf("clear buffer\n");
  302.           memset(localDim.frameBuffer, 0, localDim.frameSize);
  303. //mprintf("swap display\n");
  304.           localDim.frameBuffer = SwapDisplay(localDim.frameBuffer);
  305. //mprintf("display colormap\n");
  306.           UpdateDisplay(cachedColormap, 0, 0, 256, 64);
  307. //mprintf("display water\n");
  308.           UpdateDisplay(waterTransparency, 0, 0, 256, 256);
  309. //mprintf("display slime\n");
  310.           UpdateDisplay(slimeTransparency, 0, 0, 256, 256);
  311. //mprintf("display lava\n");
  312.           UpdateDisplay(lavaTransparency, 0, 0, 256, 256);
  313.           
  314. //mprintf("init sin/cos\n");
  315.           InitSinCosTables();
  316. //mprintf("inint face-cache\n");
  317.           InitFaceCache(bspMem);
  318. //mprintf("set point list\n");
  319.           setup_default_point_list();
  320.           
  321.           run_demo(bspMem);
  322.           
  323.           CloseKeys();
  324.           CloseDisplay();
  325.         }
  326.         
  327.         FreeClusters(bspMem, 0);
  328.         kfree();
  329.       }
  330.       fclose(bspFile);
  331.     }
  332.   }
  333.  
  334.   return 0;
  335. }
  336.